function Person(name, age) {
    this.name = name;
    this.age = age;
}

const p = new Person('张三',18);
console.log(p instanceof Person);


/* 第一步：基础参数验证
检查 Constructor是否为一个有效的构造函数（即是否有 prototype属性），或者是否为一个对象/函数。如果否，直接返回 false。
检查 instance是否为原始值（如 number, string, boolean, null, undefined, symbol, bigint）。如果是，直接返回 false，因为原始值没有原型链。
第二步：获取实例对象的原型
获取 instance的隐式原型（__proto__）。更标准的方法是使用 Object.getPrototypeOf(instance)。
第三步：沿原型链向上查找
进入一个循环（while）。
在循环中，判断当前获取到的 instance的原型是否等于 Constructor.prototype。
如果相等，说明在原型链上找到了，返回 true。
如果不相等，则继续沿着原型链向上查找：将 instance设置为其原型的原型（即 Object.getPrototypeOf(instance)或 instance.__proto__）。
如果查找到原型链的顶端（即原型为 null），则说明没有找到，循环结束，返回 false。 */
function MyInstanceOf(instance,constructorFn) {
   if(typeof instance !== 'object') return false;
   if(!constructorFn.prototype) return false;
   let proto = Object.getPrototypeOf(instance);
   while(proto) {
     if(proto === constructorFn.prototype) return true;
     proto = Object.getPrototypeOf(proto)
   } 
   return false
}

console.log('是否为构造函数的实例',MyInstanceOf(p,Person));